#include <mips/regdef.h>

.globl Push
Push:
	subu 	sp,sp,8
	sw		$fp,4(sp)
	sw		gp,0(sp)
	move	$fp,sp

	sw		a0,8($fp)		#puntero a tope de fila
	sw		a1,12($fp)		#tamaño de la pila
	sw		a2,16($fp)		#puntero a cantidad de elementos

###### chequeo de rango y si se produjo alguna excepción ######
	#mfc1 t1,$f31
	#bne t1,$0,NoSePuedeInsertarElemento

###### verificar que no este completo el vector ######
	lw 		v1,16($fp)	#guardo cantElems en un reg temporal
	lw		v0,0(v1)	#cant de elementos

	lw 		v1,12($fp)	#guardo en v1 el tamanioPila

	subu 	v0,v1,v0	#v0 = tamanio - cantElementos

	blez	v0,NoSePuedeInsertarElemento #(cantElems >= tamanioPila)Si->NoSePuedeInsertarElemento


###### Se puede agregar el elemento ######
#agrego elemento en la direccion=inicioArray + cantElems*8
#incremento cantElems
#devuelvo un 1
	lw 		t0,16($fp)	#cargo la cantElems
	lw		t0,0(t0)

	sll 	t1,t0,3		#t1=cantElems*8 (t1 va a contener la cant de bytes hacia adelante donde guardar.

	lw		v0,8($fp)
	add		v0,v0,t1	#direccion donde guardamos el double

#era 32
	l.d 	$f0,24($fp) #guardo el double (8bytes) que vino por value
	s.d 	$f0,0(v0)	#guardo el dato pasado por parametro

	addu 	t0,t0,1		#incremento cantidad de Elems.

	lw		v0,16($fp)
	sw 		t0,0(v0)	#guardo la nueva cantElems en la direcc apuntada por el ptr.
	li 		v0,1		#códDevolucionFuncion = 1
	j 		fin

NoSePuedeInsertarElemento:
	li	 	v0,0		#códDevoluciónFuncion = 0
fin:
	move 	sp,$fp
	lw 		$fp,4(sp)
	lw 		gp,0(sp) 	#(no estaba en un ejemplo de la practica pero si en otro)
	addiu 	sp,sp,8 	#Devuelvo los bytes reservados para el stackframe
	jr 		ra			#ultima sentencia de mi funcion
